﻿/********************************************************************
	created:	2012/02/26   13:49
	filename: 	hy_packet_tactics.h
	author:		zxh
	
	purpose:	数据包的接收与发送
*********************************************************************/
#ifndef _HY_PACKET_TACTICS_H_
#define _HY_PACKET_TACTICS_H_

#include <deque>

#include "hy_net_base.h"
#include "hy_msg.h"
#include "hy_mutex.h"
#include "hy_scope_locker.h"


class hy_inpacket_tactics : public hy_input_tactics 
{
public:
	//*************************************************************************
	// Method:    hy_inpacket_tactics::hy_inpacket_tactics
	// Returns:   
	// Parameter: hy_handle_base * hb
	// Qualifier:
	//*************************************************************************
	hy_inpacket_tactics(hy_handle_base*hb);

	//*************************************************************************
	// Method:    hy_inpacket_tactics::~hy_inpacket_tactics
	// Returns:   
	// Qualifier:
	//*************************************************************************
	~hy_inpacket_tactics();

	//*************************************************************************
	// Method:    hy_hh_session_input<Tservice>::handle_input
	// Returns:   hy_err_t
	// Parameter: hy_socket_t sc
	// Qualifier: recv new msg
	//*************************************************************************
	virtual hy_err_t handle_input(hy_i32_t bytes);

	//消息入口
	virtual hy_err_t process(hy_msg* block);

	//*************************************************************************
	// Method:    hy_inpacket_tactics<Tservice>::parse_msg
	// Returns:   hy_err_t
	// Parameter: hy_u32_t add
	// Qualifier:
	//*************************************************************************
	virtual hy_err_t parse_msg(hy_u32_t add);

	//*************************************************************************
	// Method:    hy_inpacket_tactics<Tservice>::handle_pre_input
	// Returns:   hy_err_t
	// Qualifier:
	//*************************************************************************
	hy_err_t handle_pre_input();

public:
	static	hy_u32_t		_in_total; //发送消息的总字节数
protected:
	
	bool	_check_flash;

	//本地缓存消息的长度
	hy_u32_t	_length;

	//本地缓存消息内容
	char		_buff[c_msg_length_max];

	//for iocp
	hy_iocp_data idata;
};



class hy_outpacket_tactics : public hy_output_tactics
{
public:
	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::hy_outpacket_tactics
	// Returns:   
	// Parameter: Tservice * service
	// Qualifier: 
	//*************************************************************************
	hy_outpacket_tactics(hy_handle_base*hb);

	//*************************************************************************
	// Method:    hy_outpacket_tactics::~hy_outpacket_tactics
	// Returns:   
	// Qualifier: 析构函数
	//*************************************************************************
	~hy_outpacket_tactics();

	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::handle_output
	// Returns:   hy_err_t
	// Parameter: hy_socket_t sc
	// Parameter: hy_u32_t bytes
	// Qualifier:
	//*************************************************************************
	virtual hy_err_t handle_output(hy_i32_t bytes);

	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::process
	// Returns:   hy_err_t
	// Parameter: hy_rwblock * block
	// Qualifier: 消息发送入口
	//*************************************************************************
	virtual hy_err_t process(hy_msg* block);
	


protected:
	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::iocp_send
	// Returns:   hy_err_t
	// Parameter: hy_socket_t sc
	// Qualifier:
	//*************************************************************************
	hy_err_t iocp_send_buff();

	//*************************************************************************
	// Method:    hy_outpacket_tactics::iocp_send
	// Returns:   hy_err_t
	// Parameter: hy_i32_t bytes
	// Qualifier:
	//*************************************************************************
	hy_err_t iocp_send(hy_i32_t bytes);

	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::iocp_send_end
	// Returns:   hy_err_t
	// Parameter: hy_u32_t bytes
	// Qualifier: 数据发送后对指针的调整
	//*************************************************************************
	hy_err_t iocp_send_end(hy_i32_t bytes);

	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::send_buff
	// Returns:   hy_err_t
	// Parameter: hy_rwblock * buff
	// Parameter: hy_socket_t sc
	// Qualifier:
	//*************************************************************************
	hy_err_t send_buff(hy_rwblock* buff);

	//*************************************************************************
	// Method:    hy_outpacket_tactics<Tservice>::send_data
	// Returns:   hy_err_t
	// Parameter: hy_socket_t sc
	// Qualifier:
	//*************************************************************************
	hy_err_t send_data();
	//*************************************************************************
	// Method:    hy_inpacket_tactics::close
	// Returns:   void
	// Qualifier: 回收所有未发送的消息
	//*************************************************************************
	void clear();
public:
	hy_mutex				_mutex;
	std::deque<hy_msg*>		_blocks;

	static	hy_u32_t		_out_total; //发送消息的总字节数

	//for iocp
	//当前发送的投递长度
	hy_u32_t				_send_pendings;
	//总的可允许投递长度
	hy_u32_t				_send_pendings_max;
	//iocp send data
	hy_iocp_data			_sdata;
};

#endif  //_HY_PACKET_TACTICS_H_
